//Title：     control_unit
//Author:     Yang Siyang
//Description:CPU控制单元
//---------------------------------------------------------
//note
    //输出信号分为3类：1.选择器的选择信号 2.写使能信号 3.ALU控制信号
    //输入指令
    //根据指令中的9位（30，14：12的func3，6：2的opcode），
    //输出控制信号
//---------------------------------------------------------
`include "defines.v"
module control_unit (inst,pc_new_sel,reg_w_en);
    input [`INST_BUS] inst;
//输出信号
    output pc_new_sel;//选择pc寄存器的新输入,0为pc+4，1为alu输出
    output reg_w_en;  //寄存器堆写使能
    output 
//---------------------------------------------------------
//I型指令的拆解
    wire [6  : 0]opcode;
    wire [4  : 0]rd;     //register destination
    wire [2  : 0]func3;  
    wire [4  : 0]rs1;
    wire [11 : 0]imm;    //immediate number
    assign opcode = inst[6  :  0];
    assign rd     = inst[11 :  7];
    assign func3  = inst[14 : 12];
    assign rs1    = inst[19 : 15];
    assign imm    = inst[31 : 20];
//---------------------------------------------------------
//指令译码(RV64I)
    //I型指令         func3      opcode[6:2] (opcode[1:0]=11)
    wire inst_lw = ~opcode[2] & ~opcode[3] & ~opcode[4] & ~opcode[5] & ~opcode[6]
                 & ~func3[0] & func3[1] & ~func3[2];
                 //010, 00000
                 //从x[rs1]+sign_ext(offset[11:0])读4个字节(32位),写入x[rd]
                 //对RV64I，结果进行符号扩展后写入
    wire inst_addi = ~opcode[2] & ~opcode[3] & opcode[4] & ~opcode[5] & ~opcode[6]
                 & ~func3[0] & ~func3[1] & ~func3[2];//000 00100

    wire inst_add = 
    wire inst_sub =
    wire inst_and =
    

//---------------------------------------------------------
//根据译码得到的指令，计算控制信号
    assign write_reg = 。。。;//写寄存器
    assign 
endmodule


